package com.tlgen.orm.components.autoFill;

import com.tlgen.orm.utils.SpringUtils;
import org.springframework.context.ApplicationContext;

import java.util.Map;

import org.springframework.beans.factory.NoSuchBeanDefinitionException;

public class AutoFillHandlerLoader {

    private static AutoFillHandler customHandler;
    private static AutoFillHandler defaultHandler;

    public static AutoFillHandler getHandler() {
        // 确保只初始化一次
        if (customHandler == null && defaultHandler == null) {
            synchronized (AutoFillHandlerLoader.class) {
                if (customHandler == null && defaultHandler == null) {
                    initHandlers();
                }
            }
        }
        return customHandler != null ? customHandler : defaultHandler;
    }

    private static void initHandlers() {
        try {
            ApplicationContext context = SpringUtils.getApplicationContext();
            if (context == null) {
                throw new IllegalStateException("Spring context not initialized");
            }

            // 1. 尝试获取所有 AutoFillHandler 的实现
            Map<String, AutoFillHandler> handlers = context.getBeansOfType(AutoFillHandler.class);

            // 2. 创建默认处理器(确保总有一个默认处理器)
            defaultHandler = context.getBean(DefaultAutoFillHandler.class);

            // 3. 查找自定义处理器(排除默认处理器)
            for (AutoFillHandler handler : handlers.values()) {
                if (handler.getClass() != DefaultAutoFillHandler.class) {
                    customHandler = handler;
                    System.out.println("Custom AutoFillHandler found: " + handler.getClass().getName());
                    break; // 找到第一个自定义处理器即停止
                }
            }

            // 4. 如果没找到自定义处理器，使用默认处理器
            if (customHandler == null) {
                System.out.println("Using default AutoFillHandler");
                customHandler = defaultHandler; // 使用默认处理器作为自定义处理器
            }
        } catch (NoSuchBeanDefinitionException e) {
            // 如果没有找到任何处理器，则创建一个默认实例
            defaultHandler = new DefaultAutoFillHandler();
            customHandler = defaultHandler;
            System.err.println("Warning: No AutoFillHandler beans found. Using programmatic default.");
        } catch (Exception e) {
            defaultHandler = new DefaultAutoFillHandler();
            customHandler = defaultHandler;
            System.err.println("Error initializing AutoFillHandler: " + e.getMessage());
        }
    }
}